﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;
using AccesoBD;

namespace PresentacionEscritorio
{
    public partial class frmAsignarTurno : Form
    {
        public long IdTurno { get; set; }
        public frmGestionTurnos2 MyFormPadre { get; set; }
        private Turno oT = null;
        private Paciente p = null;
        public int codEspecialidad { get; set; }
        public long legajoMedico { get; set; }
        public string nombreMedico { get; set; }
        public string nombreEspecialidad { get; set; }
        private bool seleccionado = false;
        public int tipo { get; set; }//Si es por turno o por orden de llegada, TIPO=1 por turno y TIPO=2 por orden de llegada.
        public frmAsignarTurno()
        {
            InitializeComponent();

        }

        private void frmAsignarTurno_Load(object sender, EventArgs e)
        {
            lblPaciente.Visible = false;
            txtMedico.Visible = false;
            txtEspecialidad.Visible = false;
            cargarComboTipoDocumento();
            cargarGrillaPacientes();
            cargarDatosTurno();


        }

        private void cargarDatosTurno()
        {
            //buscar el turno en base a su id: mostramos la fecha del turno, la hora, la esp y el medico
            if (tipo == 1)//Tipo Turno
            {
                oT = GestorAgendaTurnos.obtenerTurnoPorID(IdTurno);
                if (oT != null)
                {
                    lblTurno.Text = "Medico: " + oT.nombreApellidoMedico + "\n\r"
                        + "Especialidad: " + oT.nombreEspecialidad + "\n\r"
                        + "Fecha del Turno: " + oT.FechaTurno.ToString("dd/MM/yyyy") + "\n\r"
                         + "Hora del Turno: " + oT.HoraTurno;
                }
            }
            else//Tipo orden de llegada
            {
                txtEspecialidad.Visible = true;
                txtMedico.Visible = true;
                txtEspecialidad.ReadOnly = true;
                txtEspecialidad.Text = nombreEspecialidad;
                txtMedico.Text = nombreMedico;
                groupBox1.Text = "Orden de llegada";
                lblTurno.Text = "Medico y especialidad a atender";
                DateTime fecha = DateTime.Now;
                int dia = obtenerDiaSemana(fecha);
                //   List<EspecialidadMedico> lsEs = Especialidades.obtenerEspecXMedicoXDia(3);


            }

        }
        private int obtenerDiaSemana(DateTime fecha)
        {
            int dia = 0;
            switch (fecha.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    dia = 6;
                    break;
                case DayOfWeek.Monday:
                    dia = 2;
                    break;
                case DayOfWeek.Saturday:
                    dia = 7;
                    break;
                case DayOfWeek.Sunday:
                    dia = 1;

                    break;
                case DayOfWeek.Thursday:
                    dia = 5;
                    break;
                case DayOfWeek.Tuesday:
                    dia = 3;
                    break;
                case DayOfWeek.Wednesday:
                    dia = 4;
                    break;
                default:
                    break;
            }
            return dia;

        }
        private void CargarTipo(int tipo)
        {
            this.tipo = tipo;

        }
        private void cargarComboTipoDocumento()
        {
            GestorTiposDocumento gtd = new GestorTiposDocumento();
            List<TipoDocumento> listTipoDoc = gtd.obtenerTipoDocumento();
            cmbTipoDoc.DataSource = listTipoDoc;
            cmbTipoDoc.ValueMember = "Codigo";
            cmbTipoDoc.DisplayMember = "Nombre";
            cmbTipoDoc.SelectedIndex = -1;

        }

        private void cargarGrillaPacientes()
        {
            //traemos todos los pacientes
            GestorDePaciente gp = new GestorDePaciente();
            List<Paciente> lp = gp.obtenerTodosPaciente();
            dgvPacientes.Rows.Clear();
            foreach (Paciente oP in lp)
            {
                int i = dgvPacientes.Rows.Add();
                dgvPacientes.Rows[i].Cells["Nombre"].Value = oP.Nombre;
                dgvPacientes.Rows[i].Cells["Apellido"].Value = oP.Apellido;
                dgvPacientes.Rows[i].Cells["NroDocumento"].Value = oP.NroDocumento;
                dgvPacientes.Rows[i].Cells["TipoDePaciente"].Value = oP.nombreTipoPaciente;
            }

        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (tipo == 1)//Tipo TURNO
            {
                //asignar el turno en la bd (update en la fila del turno, dandole el nrohc e idpersona del paciente y actualizando el idestado)
                if (seleccionado == true)
                {
                    DialogResult r = MessageBox.Show("Paciente: " + p.Nombre + ", " + p.Apellido + "\n\r" + "Especialidad: " + oT.nombreEspecialidad + "\n\r" + "Fecha del turno: " + oT.FechaTurno.ToString("dd/MM/yyyy") + "\n\r" + "Hora del turno: " + oT.HoraTurno, "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                    if (r == DialogResult.Yes)
                    {
                        asignarTurno();
                    }
                }
                else
                {
                    MessageBox.Show("No seleccionó a ningun paciente", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }

            }
            if (tipo == 2)//Tipo Orden LLegada
            {
                if (seleccionado == true)
                {
                    if (txtMedico.Text != "")
                    {
                        DialogResult r = MessageBox.Show("Paciente: " + p.Nombre + ", " + p.Apellido + "\n\r" + "Especialidad: " + this.nombreEspecialidad + "\n\r" + "Fecha : " + DateTime.Now.ToString("dd/MM/yyyy") + "\n\r" + "Medico: " + this.nombreMedico, "Aviso", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                        if (r == DialogResult.Yes)
                        {
                            ItemListadoOrdenLlegada oL = new ItemListadoOrdenLlegada();

                            oL.fechaListado = DateTime.Now;
                            oL.IdEspecialidad = this.codEspecialidad;
                            oL.LegajoMedico = this.legajoMedico;
                            oL.nroHCpaciente = p.nroHC;
                            oL.idPersona = p.idPersona;
                            oL.Atendido = false;
                            oL.Cobrado = false;
                            oL.idEstado = 2;
                            oL.horaLLegada = TimeSpan.Parse(DateTime.Now.TimeOfDay.ToString(@"hh\:mm"));

                            long idNuevo;
                            bool res = ListadosOrdenLlegada.registrarLLegadaListado(oL,out idNuevo);
                            if (res==true)
                            {
                                oL.idItemListado = idNuevo;
                            }


                            if (res == true)
                            {
                                IListadoOrdenLLegada iparent = this.Owner as IListadoOrdenLLegada;
                                iparent.addItemLista(oL);
                                this.Close();

                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("No seleccionó a ningun Medico para realizar la atencion", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    }

                }
                else
                {
                    MessageBox.Show("No seleccionó a ningun paciente", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }

        }

        private void asignarTurno()
        {
            //asignar el turno en la bd (update en la fila del turno, dandole el nrohc e idpersona del paciente y actualizando el idestado)
            long nrHC = p.nroHC;
            long idPaciente = p.idPersona;
            int estadoTurno = 2;
            //ASIGNAMOS EL TURNO
            bool res = GestorAgendaTurnos.asignarTurno(nrHC, idPaciente, estadoTurno, IdTurno);

            if (res == true)
            {
                MessageBox.Show("Se asignó de manera correcta el turno", "Aviso", MessageBoxButtons.OK);
                MyFormPadre.actualizarEstadoTurno();
                this.Dispose();
            }
            else
            {
                MessageBox.Show("No se asigno el turno", "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error);
            }
        }

        private void dgvPacientes_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvPacientes.CurrentCell.OwningColumn == dgvPacientes.Columns["seleccionar"])
            {
                string nombre = dgvPacientes.Rows[e.RowIndex].Cells["Nombre"].Value.ToString();
                string apellido = dgvPacientes.Rows[e.RowIndex].Cells["Apellido"].Value.ToString();
                string nroDoc = dgvPacientes.Rows[e.RowIndex].Cells["NroDocumento"].Value.ToString();
                string tipoPaciente = dgvPacientes.Rows[e.RowIndex].Cells["TipoDePaciente"].Value.ToString();
                modificarLblPaciente(nombre, apellido, nroDoc, tipoPaciente);
                obtenerPaciente(nroDoc, apellido);
                seleccionado = true;
            }
        }

        private void modificarLblPaciente(string n, string a, string nd, string tP)
        {
            lblPaciente.Visible = true;
            lblPaciente.Text = "Paciente: " + n + ", " + a + "\n\r"
                    + "Nª Documento: " + nd + "\n\r"
                    + "Tipo de Paciente: " + tP;
        }
        private void obtenerPaciente(string nroDoc, string apellido)
        {
            GestorDePaciente gp = new GestorDePaciente();
            List<Paciente> lp = gp.obtenerTodosPaciente();
            foreach (Paciente oP in lp)
            {
                if (oP.NroDocumento == long.Parse(nroDoc) && oP.Apellido.Equals(apellido))
                {
                    p = new Paciente();
                    p.Apellido = oP.Apellido;
                    p.Nombre = oP.Nombre;
                    p.idPersona = oP.idPersona;
                    p.nroHC = oP.nroHC;
                    break;
                }

            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            string apellido = null;
            long? nroDocumento = null;
            long? nroHC = null;

            if (!string.IsNullOrEmpty(txtApellido.Text))
            {
                apellido = txtApellido.Text;
            }
            if (!string.IsNullOrEmpty(txtNroDoc.Text))
            {
                nroDocumento = long.Parse(txtNroDoc.Text);
            }
            if (!string.IsNullOrEmpty(txtNroHC.Text))
            {
                nroHC = long.Parse(txtNroHC.Text);
            }
            GestorDePaciente gP = new GestorDePaciente();
            int? codComboTipoDoc = null;
            dgvPacientes.Rows.Clear();
            if (cmbTipoDoc.SelectedValue!=null)
            {
                  codComboTipoDoc = int.Parse(cmbTipoDoc.SelectedValue.ToString());
            }
        
           
            //    List<Paciente> lp = gP.obtenerPacientePorFiltro(nroHC,apellido, codComboTipoDoc, nroDocumento);
            List<Paciente> lp = Pacientess.buscarConFiltros2(nroHC, codComboTipoDoc, nroDocumento, apellido);
            if (lp != null)
            {
                foreach (Paciente oP in lp)
                {
                    int i = dgvPacientes.Rows.Add();
                    dgvPacientes.Rows[i].Cells["Nombre"].Value = oP.Nombre;
                    dgvPacientes.Rows[i].Cells["Apellido"].Value = oP.Apellido;
                    dgvPacientes.Rows[i].Cells["NroDocumento"].Value = oP.NroDocumento;
                    dgvPacientes.Rows[i].Cells["TipoDePaciente"].Value = oP.nombreTipoPaciente;
                }
            }
            else
            {
                MessageBox.Show("El paciente no existe", "Aviso", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            }


        }
        private bool validar()
        {
            bool res = true;
            if (string.IsNullOrEmpty(txtNroHC.Text) && string.IsNullOrEmpty(txtNroDoc.Text) && string.IsNullOrEmpty(txtApellido.Text))
            {
                res = false;
            }
            if (cmbTipoDoc.SelectedIndex == -1)
            {

                res = false;
            }
            return res;

        }
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }






    }
}
